package com.itheima.leetcode.od.c.logicalsimulation;

import java.util.*;
import java.util.stream.Collectors;

/**
 * <h3>记票统计</h3>
 */
public class TicketCounting {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // --- 输入处理 ---

        // 读取候选人数量，读取整行再转换为整数
        int num_candidates = Integer.parseInt(scanner.nextLine());

        // 读取包含候选人名字的整行
        String line = scanner.nextLine();
        String[] names = line.split(" ");

        // 使用一个 List 来保持候选人的原始顺序
        List<String> candidate_order = new ArrayList<>();
        // 使用 LinkedHashMap 存储票数，它既能快速查找，又能保持插入顺序
        Map<String, Integer> votes_count = new LinkedHashMap<>();

        // 初始化候选人列表和票数map
        for (String name : names) {
            candidate_order.add(name);
            votes_count.put(name, 0); // 初始化票数为0
        }

        // 读取投票者数量，同样读取整行再转换
        int num_voters = Integer.parseInt(scanner.nextLine());

        // 读取包含所有投票的整行
        line = scanner.nextLine();
        // 如果投票行为空行，split会产生一个包含空字符串的数组。我们需要处理这种情况。
        String[] votes = line.isEmpty() ? new String[0] : line.split(" ");

        // 初始化无效票计数器
        int invalid_votes_count = 0;

        // 遍历所有投票
        for (String vote : votes) {
            // 确保我们不把 split 产生的空字符串计为无效票
            if (vote.isEmpty()) {
                continue;
            }

            // map.containsKey() 可以检查一个键是否存在
            if (votes_count.containsKey(vote)) {
                // 如果存在，是合法票，票数+1
                votes_count.put(vote, votes_count.get(vote) + 1);
            } else {
                // 否则是无效票
                invalid_votes_count++;
            }
        }

        scanner.close();

        // --- 输出结果 ---

        // 遍历原始顺序的List来保证输出顺序
        System.out.println(candidate_order.stream()
                .map(s -> s + " : " + votes_count.get(s))
                .collect(Collectors.joining("\n")));

        // 输出无效票数
        System.out.println("Invalid : " + invalid_votes_count);
    }
}